package tools;

import org.junit.Test;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;

import java.io.BufferedReader;
import java.io.FileReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author ：quanhz
 * @date ：Created in 2019/9/24 16:43
 */
public class MyClassPathUtil {

    @Test
    public void fun1(){
        // 按指定模式在字符串查找
        String line = "<h3><a id=\"NoSql__0\"></a>NoSql 简介</h3>\n" +
                "<h4><a id=\"1_4\"></a>1、概述</h4>\n" +
                "<p>NoSql=Not only sql 意思是不仅仅是sql泛指非关系型数据库，nosql无需事先为要存储的数据建立字段，随时可以存储自定义的数据格式，而在关系数据库里，增删字段是一件非常麻烦的事情，如果是非常大数据量的表，增加字段就很麻烦。</p>\n" +
                "<h4><a id=\"2NosqlRDBMS_10\"></a>2、Nosql与关系型数据库（RDBMS）的区别</h4>\n" +
                "<table>\n" +
                "<thead>\n" +
                "<tr>\n" +
                "<th style=\"text-align:left\">NOSQL</th>\n" +
                "<th style=\"text-align:left\">RDBMS</th>\n" +
                "</tr>\n" +
                "</thead>\n" +
                "<tbody>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">代表着不仅仅是sql</td>\n" +
                "<td style=\"text-align:left\">高度组织化结构化的数据</td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">没有声明性查询语言</td>\n" +
                "<td style=\"text-align:left\">结构化查询语言sql</td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">没有预定义的模式</td>\n" +
                "<td style=\"text-align:left\">数据和关系都存储在单独的表中</td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">键值对存储，列存储，文档存储，图形化数据库</td>\n" +
                "<td style=\"text-align:left\">数据操纵语言没数据定义语言dml ddl</td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">最终一致性，而非acid属性</td>\n" +
                "<td style=\"text-align:left\">严格的一致性</td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">非结构化和不可预知的数据</td>\n" +
                "<td style=\"text-align:left\">基础事务</td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">cap定理（Consistency(一致性), 数据一致更新，所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容忍性) 可靠性）</td>\n" +
                "<td style=\"text-align:left\"></td>\n" +
                "</tr>\n" +
                "<tr>\n" +
                "<td style=\"text-align:left\">高性能，高可用性和可伸缩性</td>\n" +
                "<td style=\"text-align:left\"></td>\n" +
                "</tr>\n" +
                "</tbody>\n" +
                "</table>\n" +
                "<hr />\n" +
                "<h4><a id=\"3NoSql__27\"></a>3、NoSql 特性</h4>\n" +
                "<p>3V+3高 海量Volume多样Variety实时Velocity 高并发 高可扩 高性能</p>\n" +
                "<h4><a id=\"4nosqlnosqlsql_33\"></a>4、当下nosql的经典应用（nosql和sql一起使用）</h4>\n" +
                "<p>nosql数据模型简介</p>\n" +
                "<ul>\n" +
                "<li>商品基本信息（名称，价格，出产日期，生产产商等）关系型数据库</li>\n" +
                "<li>商品描述，详情，评价信息（多文字类）文档数据库mongDB</li>\n" +
                "<li>商品图片 商品图片展现类 分布式的文件系统中（淘宝自己的tfs google的gfs hadoop的hdfs）</li>\n" +
                "<li>商品的关键字（搜索引擎 ISearch）</li>\n" +
                "<li>商品的波段性的热点高频信息（内存数据库：tair redis memcached）</li>\n" +
                "</ul>\n" +
                "<h4><a id=\"5NoSql_45\"></a>5、NoSql数据模型</h4>\n" +
                "<p>以一个电商客户、订单、订购、地址模型来对比下关系型数据库和菲关系型数据库</p>\n" +
                "<ul>\n" +
                "<li>\n" +
                "<p>传统方式 1:1 1:N N:N 主外键</p>\n" +
                "</li>\n" +
                "<li>\n" +
                "<p>nosql json</p>\n" +
                "</li>\n" +
                "</ul>\n" +
                "<pre><code class=\"lang-json\">{\n" +
                " &quot;customer&quot;:{\n" +
                "   &quot;id&quot;:1136,\n" +
                "   &quot;name&quot;:&quot;Z3&quot;,\n" +
                "   &quot;billingAddress&quot;:[{&quot;city&quot;:&quot;beijing&quot;}],\n" +
                "   &quot;orders&quot;:[\n" +
                "    {\n" +
                "      &quot;id&quot;:17,\n" +
                "      &quot;customerId&quot;:1136,\n" +
                "      &quot;orderItems&quot;:[{&quot;productId&quot;:27,&quot;price&quot;:77.5,&quot;productName&quot;:&quot;thinking in java&quot;}],\n" +
                "      &quot;shippingAddress&quot;:[{&quot;city&quot;:&quot;beijing&quot;}]\n" +
                "      &quot;orderPayment&quot;:[{&quot;ccinfo&quot;:&quot;111-222-333&quot;,&quot;txnid&quot;:&quot;asdfadcd334&quot;,&quot;billingAddress&quot;:{&quot;city&quot;:&quot;beijing&quot;}}],\n" +
                "      }\n" +
                "    ]\n" +
                "  }\n" +
                "}\n" +
                "</code></pre>\n" +
                "<h4><a id=\"6nosql_74\"></a>6、nosql数据库四大分类</h4>\n" +
                "<ol>\n" +
                "<li>\n" +
                "<p>KV键值：新浪（berkeley+redis）美团（redis+tair）阿里，百度（memcached+redis）</p>\n" +
                "</li>\n" +
                "<li>\n" +
                "<p>文档型（bson格式较多）：CouchDB，MongDB(是一个基于分布式文件存储的数据库，由c++语言编写，旨在为web应用提供可扩展的高性能数据存储解决方案，其介于关系数据库和非关系数据库之间，是非关系数据库当中功能最丰富的，最像关系数据库的)</p>\n" +
                "</li>\n" +
                "<li>\n" +
                "<p>列存储数据库：Cassandra,Hbase,分布式文件系统</p>\n" +
                "</li>\n" +
                "<li>\n" +
                "<p>图关系数据库（它不是放图形的，放的是关系比如：朋友圈社交网网络，广告推荐）：Neo4j.InfoGird</p>\n" +
                "</li>\n" +
                "</ol>\n";
        String pattern = "<h\\d>.*</h\\d>";

        Pattern r = Pattern.compile(pattern);

        Matcher m = r.matcher(line);

        String levelPattern = "<h\\d>.*</h\\d>";

        while (m.find()){
            System.out.println( m.group(0) );
            String str = m.group(0);
        }

        String s2 = "</a>6、nosql数据库四大分类</h4>";
        String substring = s2.substring(4, s2.length()-5);
        System.out.println(substring);

        System.out.println("\"<h4>\".substring(2,3) = " + "<h4>".substring(2, 3));
    }

    @Test
    public void fun2(){
        String s1 = "aaabb";
        String s2 = "aabbb";
        System.out.println(CheckPermutation(s1, s2));
    }

    public   boolean CheckPermutation(String s1, String s2) {
        if(s1.length()!=s2.length()){
            return false;
        }

        String s3 = new String(s1);
        for(int i=0;i<s3.length();i++){
            String s = String.valueOf(s3.charAt(i));
            if(s1.contains(s) && s2.contains(s)){
                s1 = s1.replace(s,"");
                s2 = s2.replace(s,"");
            }
        }

        return s1.equals(s2);

    }


    public boolean isSingle(String s) {

        char[] chars = s.toCharArray();
        for (char aChar : chars) {
            int indexOf = s.indexOf(aChar);
            int lastIndexOf = s.lastIndexOf(aChar);
            if(indexOf!=lastIndexOf){
                return false;
            }
        }


        return true;
    }

    public static void classPathConver(Set<String> paths) {
        String template = "<include name=\"XXX\"/>";
        ArrayList<String> currPaths = new ArrayList<>();
        if (paths != null && paths.size() > 0) {
            String currPath = "";
            for (String path : paths) {
                if (path.indexOf(".java") > -1) {
                    int beginIndex = path.lastIndexOf("\\java\\") + 5;
                    String tmpPath = path.substring(beginIndex + 1, path.length()).replace(".java", "*.class").replace("\\", "/");
                    currPath = template.replace("XXX", "WEB-INF/classes/" + tmpPath);
                    currPaths.add(currPath);
                } else {
                    if (path.lastIndexOf("\\webapp\\") > -1) {
                        int beginIndex = path.lastIndexOf("\\webapp\\") + 7;
                        currPath = path.substring(beginIndex + 1, path.length()).replace("\\", "/");
                        currPath = template.replace("XXX", currPath);
                        currPaths.add(currPath);
                    }

                }
                System.out.println(currPath);
            }
        }
    }

    public static void main(String[] args) {
        Set<String> paths = new HashSet<>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader("src/test/java/tools/convertPaths.txt"));
            String line = "";
            while ((line = reader.readLine()) != null) {
                paths.add(line);
            }
            MyClassPathUtil.classPathConver(paths);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
